package cn.tedu.jdbc.utils;

import java.sql.*;
import java.util.ResourceBundle;

/**
 * JDBC工具类
 */
public class DbUtils {
    /**
     * 工具类的构造方法一般都是死优化的，因为工具类中的一般都是静态的
     * 工具类就是为了方便编程，所以工具类中的方法都是直接采用技能
     * 的方式访问，因此不需要new对象
     */

    private  DbUtils(){}
    //静态变量
    private static String driver;
    private static String url;
    private static String user;
    private static String password;


    //静态代码块
    static {
        //在这里读取属性配置文件，给静态变量赋值
        ResourceBundle bundle = ResourceBundle.getBundle("jdbc");
        driver = bundle.getString("driver");
        url = bundle.getString("url");
        user = bundle.getString("user");
        password = bundle.getString("password");

        //在类加载的时候，注册驱动，对于整个应用程序来说，注册驱动只需要做一次即可，suoyixuanzejingtaidaimakuai
        //静态代码块在类加载时执行，并且只执行一次
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取数据库连接对象
     * @return 连接对象
     */
    public static Connection getConnection(){
        //实际上这里每一次调用 getConnection() 方法时，都会获取一个全新的数据库连接对象，实际上这样效率是比较低的，后期会使用连接池进行改造。
        try {
            Connection conn = DriverManager.getConnection(url, user, password);
            return conn;
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 释放资源
     * @param conn 连接对象
     * @param stmt 数据库操作对象
     * @param rs   结果集对象
     */
    public static void close (Connection conn, Statement stmt, ResultSet rs){
        //6.释放资源
        if (conn != null){
            try {
                conn.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
        if (stmt != null){
            try {
                stmt.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
        if (rs != null){
            try {
                rs.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    }
}
